package com.smart.community.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.commons.result.PageResult;
import com.smart.community.feign.property.service.IUserPropertyCompanyFeign;
import com.smart.community.user.dto.LoginLogQueryDTO;
import com.smart.community.user.entity.LoginLog;

import java.util.List;

/**
 * 登录日志服务接口
 * 
 * @author Wu.Liang
 * @since 2024-12-21
 */
public interface LoginLogService extends IService<LoginLog> {

    /**
     * 记录登录日志
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @param status 登录状态
     * @param message 登录消息
     * @throws Exception 统一异常
     */
    void recordLoginLog(Long userId, String username, String ipAddress, String userAgent, Integer status, String message) throws Exception;

    /**
     * 获取用户最近登录日志
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 登录日志列表
     * @throws Exception 统一异常
     */
    List<LoginLog> getRecentLoginLogs(Long userId, Integer limit) throws Exception;
    
    /**
     * 分页查询登录日志
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     * @throws Exception 统一异常
     */
    PageResult<LoginLog> getLoginLogPage(LoginLogQueryDTO queryDTO) throws Exception;
    
    /**
     * 分页查询登录日志（带权限控制）
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     * @throws Exception 统一异常
     */
    PageResult<LoginLog> getLoginLogPageWithPermission(LoginLogQueryDTO queryDTO) throws Exception;
    
    /**
     * 根据用户ID分页查询登录日志
     * 
     * @param userId 用户ID
     * @param current 当前页码
     * @param size 每页大小
     * @return 分页结果
     * @throws Exception 统一异常
     */
    PageResult<LoginLog> getLoginLogByUserId(Long userId, Integer current, Integer size) throws Exception;
    
    /**
     * 根据物业公司ID分页查询登录日志
     * 
     * @param propertyCompanyId 物业公司ID
     * @param current 当前页码
     * @param size 每页大小
     * @return 分页结果
     * @throws Exception 统一异常
     */
    PageResult<LoginLog> getLoginLogByPropertyCompanyId(Long propertyCompanyId, Integer current, Integer size) throws Exception;
    
    /**
     * 获取用户物业公司Feign接口
     * 
     * @return Feign接口
     */
    IUserPropertyCompanyFeign getUserPropertyCompanyFeign();
} 